<?php

namespace Platform\Services\Wechat;

use Platform\Services\BaseService;

class WechatService extends BaseService {

    /**
     * 微信服务号获取用户信息
     * @param type $code
     * @return boolean
     */
    public function getWechatServiceToken($code) {
        $tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . WX_GJGJ_SERVICE_NUMBER_APPID . "&secret=" . WX_GJGJ_SERVICE_NUMBER_APPSECRET . "&code=" . $code . "&grant_type=authorization_code";
        $tokenStc = file_get_contents($tokenUrl);
        $tokenResult = json_decode($tokenStc, true);
        if (isset($tokenResult['access_token'])) {
            return $tokenResult;
        } else {
            return false;
        }
    }

    /**
     * access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。
     * access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时，需定时刷新，重复获取将导致上次获取的access_token失效。
     * @param type $APPID
     * @param type $APPSECRET
     * @return boolean
     */
    public function getWechatAccessToken($APPID, $APPSECRET) {
        $accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $APPID . "&secret=" . $APPSECRET;
        $tokenStc = file_get_contents($accessTokenUrl);
        $tokenResult = json_decode($tokenStc, true);
        if (isset($tokenResult['access_token'])) {
            return $tokenResult;
        } else {
            return false;
        }
    }

    /**
     * 微信服务号拉取用户信息(需scope为 snsapi_userinfo)
     * @param type $code
     * @return boolean
     */
    public function getWechatServiceUserInfo($openId, $token) {
        $userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $token . "&openid=" . $openId . "&lang=zh_CN";
        $userInfoStc = file_get_contents($userInfoUrl);
        $userInfoResult = json_decode($userInfoStc, true);
        if (isset($userInfoResult['openid'])) {
            return $userInfoResult;
        } else {
            return false;
        }
    }

    /**
     * code 换取 session_key
     * 这是一个 HTTPS 接口，开发者服务器使用登录凭证 code 获取 session_key 和 openid。
     * @param type $code
     */
    public function getMiniappSessionKey($code) {
        $sessionKeyUrl = "https://api.weixin.qq.com/sns/jscode2session?appid=" . WX_GJGJ_MINI_RED_PACKET_APPID . "&secret=" . WX_GJGJ_MINI_RED_PACKET_APPSECRET . "&js_code=" . $code . "&grant_type=authorization_code";
        $userInfoStc = file_get_contents($sessionKeyUrl);
        $userInfoResult = json_decode($userInfoStc, true);
        if (isset($userInfoResult['openid'])) {
            return $userInfoResult;
        } else {
            return false;
        }
    }

    /**
     * 检验数据的真实性，并且获取解密后的明文.
     * @param $sessionKey string code 换取到的 session_key
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     *
     * @return int 成功0，失败返回对应的错误码 or $data string 解密后的原文
     */
    public function getMiniappEncryptData($sessionKey, $encryptedData, $iv) {
        $WXBizDataCryptClient = new \Platform\Libs\WXBizDataCryptClient(WX_GJGJ_MINI_RED_PACKET_APPID, $sessionKey);
        $data = $WXBizDataCryptClient->decryptData($encryptedData, $iv);
        if ($data === FALSE) {
            E("数据解密失败");
        }
        return $data;
    }

    /**
     * 适用于需要的码数量极多，或仅临时使用的业务场景
     * @param type $scene  最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
     * @param type $page   必须是已经发布的小程序页面，例如 "pages/index/index" ,根路径前不要填加'/',不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
     * @param type $width  二维码的宽度
     * @param type $auto_color 自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调
     * @param type $line_color auto_color 为 false 时生效，使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"}
     */
    public function getMiniappCodeUnLimit($scene, $page, $width = 430) {
        $redisKey = getRedisKey("SYSTEM", "MINIAPP_", "RED_PACKET_ASSESS_TOKEN");
        if ($this->redisCache->exists($redisKey)) {
            $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN = $this->redisCache->get($redisKey);
        } else {
            $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN = $this->getWechatAccessToken(WX_GJGJ_MINI_RED_PACKET_APPID, WX_GJGJ_MINI_RED_PACKET_APPSECRET);
            $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN = $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN['access_token'];
            $this->redisCache->set($redisKey, $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN);
            $this->redisCache->expire($redisKey, 7200);
        }
        $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $WX_GJGJ_MINI_RED_PACKET_ASSESS_TOKEN;
        $aPOSTParam['scene'] = $scene;
        $aPOSTParam['page'] = $page;
        $imgContentStream = lib("HttpUtil")->http_post($url, json_encode($aPOSTParam));
        return $imgContentStream;
    }

}

?>
